 /*******************************************************************************
  * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - Initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.browser;

 import java.io.File ;

 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.DropTargetAdapter;
 import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.FileTransfer;
 import org.eclipse.swt.dnd.TransferData;
 /**
  *
  */
 public class WebBrowserViewDropAdapter extends DropTargetAdapter {
    /**
     * The view to which this drop support has been added.
     */
    private BrowserViewer view;

    /**
     * The current operation.
     */
    private int currentOperation = DND.DROP_NONE;

    /**
     * The last valid operation.
     */
    private int lastValidOperation = DND.DROP_NONE;
    
    protected WebBrowserViewDropAdapter(BrowserViewer view) {
         this.view = view;
     }

    /* (non-Javadoc)
     * Method declared on DropTargetAdapter.
     * The mouse has moved over the drop target. If the
     * target item has changed, notify the action and check
     * that it is still enabled.
     */
    private void doDropValidation(DropTargetEvent event) {
        //update last valid operation
 if (event.detail != DND.DROP_NONE)
            lastValidOperation = event.detail;
        
        //valid drop and set event detail accordingly
 if (validateDrop(event.detail, event.currentDataType))
            currentOperation = lastValidOperation;
        else
            currentOperation = DND.DROP_NONE;
        
        event.detail = currentOperation;
    }

    /* (non-Javadoc)
     * Method declared on DropTargetAdapter.
     * The drop operation has changed, see if the action
     * should still be enabled.
     */
    public void dragOperationChanged(DropTargetEvent event) {
        doDropValidation(event);
    }

    /* (non-Javadoc)
     * Method declared on DropTargetAdapter.
     * The mouse has moved over the drop target. If the
     * target item has changed, notify the action and check
     * that it is still enabled.
     */
    public void dragOver(DropTargetEvent event) {
        //set the location feedback
 event.feedback = DND.FEEDBACK_SELECT;

        //see if anything has really changed before doing validation.
 doDropValidation(event);
    }

    /* (non-Javadoc)
     * Method declared on DropTargetAdapter.
     * The user has dropped something on the desktop viewer.
     */
    public void drop(DropTargetEvent event) {
        //perform the drop behaviour
 if (!performDrop(event.data))
            event.detail = DND.DROP_NONE;
        
        currentOperation = event.detail;
    }

    /* (non-Javadoc)
     * Method declared on DropTargetAdapter.
     * Last chance for the action to disable itself
     */
    public void dropAccept(DropTargetEvent event) {
        if (!validateDrop(event.detail, event.currentDataType))
            event.detail = DND.DROP_NONE;
    }

     public void dragEnter(DropTargetEvent event) {
         if (event.detail == DND.DROP_DEFAULT)
             event.detail = DND.DROP_COPY;

        doDropValidation(event);
     }

     /**
     * Performs any work associated with the drop.
     * <p>
     * Subclasses must implement this method to provide drop behavior.
     * </p>
     *
     * @param data the drop data
     * @return <code>true</code> if the drop was successful, and
     * <code>false</code> otherwise
     */
     protected boolean performDrop(Object data) {
         if (data instanceof String []) {
             String [] s = (String []) data;
             if (s == null || s.length == 0)
                 return true;
             File f = new File (s[0]);
             try {
                 view.setURL(f.toURL().toExternalForm());
             } catch (Exception e) {
                 // TODO
 }
         }
         
         return true;
     }

     /**
     * Validates dropping on the given object. This method is called whenever some
     * aspect of the drop operation changes.
     * <p>
     * Subclasses must implement this method to define which drops make sense.
     * </p>
     *
     * @param target the object that the mouse is currently hovering over, or
     * <code>null</code> if the mouse is hovering over empty space
     * @param operation the current drag operation (copy, move, etc.)
     * @param transferType the current transfer type
     * @return <code>true</code> if the drop is valid, and <code>false</code>
     * otherwise
     */
     protected boolean validateDrop(int operation, TransferData transferType) {
         if (FileTransfer.getInstance().isSupportedType(transferType))
             return true;
         /*if (ResourceTransfer.getInstance().isSupportedType(transferType))
             return true;
         if (LocalSelectionTransfer.getInstance().isSupportedType(transferType))
             return true;*/
         
         return false;
     }
 }

